/* 
 * 文件描述和底层基础模拟
 */


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<assert.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>

#define NUM 1024












// struct MyFILE
// {
//   int fd;
//   char buf[1024];
//   int end; // 缓冲区的结尾
// };
// typedef struct MyFILE MyFILE;
// MyFILE *fopen_(const char *pathname, const char *mode)
// {
//   assert(pathname && mode);
// 
//   MyFILE *fp = NULL;
// 
//   if(strcmp(mode, "r") == 0)
//   {}
//   else if(strcmp(mode, "r+") == 0)
//   {}
//   else if(strcmp(mode, "w") == 0)
//   {
//     int fd = open(pathname, O_WRONLY | O_TRUNC | O_CREAT, 0666);
//     if(fd >= 0)
//     {
//       fp = (MyFILE*)malloc(sizeof(MyFILE));
//       memset(fp, 0, sizeof(MyFILE));
// 
//       fp->fd = fd;
//     }
//   }
//   else if(strcmp(mode, "w+") == 0)
//   {}
//   else if(strcmp(mode, "a") == 0)
//   {}
//   else if(strcmp(mode, "a+") == 0)
//   {}
//   else 
//   {}
// 
//   return fp;
// }
// 
// void fputs_(const char * message, MyFILE *fp)
// {
//   assert(message && fp);
// 
//   strcpy(fp->buf + fp->end , message);
//   fp->end += strlen(message);
// 
//   // 测试
//   printf("%s\n", fp->buf);
// 
// 
//     if(fp->fd == 0)
//     {
//       // stdin
//       //
//     }
//     else if(fp->fd == 1)
//     {
//       // stdout
//       
// 
//       if(fp->buf[fp->end - 1] == '\n')
//       {
//         printf("buf: %s\n", fp->buf);
//         write(fp->fd, fp->buf, fp->end);
//         fp->end = 0;
//       }
//     }
//     else if(fp->fd == 2)
//     {
//       // stderr
//     }
//     else 
//     {
//       // other
//     }
// }
// 
// void fflush_(MyFILE *fp)
// {
//   assert(fp);
// 
//   if(fp->end)
//   {
//     // 暂且认为刷新了,只是写到内核中
//     write(fp->fd, fp->buf, fp->end);
//     syncfs(fp->fd);
//     fp->end = 0;
// 
//   }
// }
// 
// void fclose_(MyFILE * fp)
// {
//   assert(fp);
// 
//   fflush_(fp);
//   close(fp->fd);
//   free(fp);
// }
// 
// int main()
// {
//   MyFILE *fp = fopen_("./log.txt", "w");
//   if(!fp)
//   {
//     printf("open file error\n");
//     return 1;
//   }
// 
//   fputs_("zxcsffiweun", fp);
//   fputs_("webfcv\n", fp);
// 
//   fork();
//   fclose_(fp);
// }
